package org.bibpessoal.daos;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TimeZone;

import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.bibpessoal.entidades.Livro;
import org.bibpessoal.entidades.Usuario;
import org.bibpessoal.exceptions.LivroInvalidoException;

@Stateless
public class LivroDAOImpl implements LivroDAO {
	@PersistenceContext(unitName = "BibPessoalPU")
	private EntityManager em;
	
	private List<Livro> livrosEmprestados;

	public LivroDAOImpl() {
		super();
	}

	@Override
	public boolean cadastrarLivro(Usuario usuario, Livro livro)
			throws LivroInvalidoException {

		if (livro != null && usuario != null) {
			if (livro.getTitulo() == null) {
				throw new LivroInvalidoException("O título do livro deve ser preenchido");
			} else {
				System.err.println("ID do usuário que está inserindo um livro  = "+usuario.getId());
				Usuario usr = em.find(Usuario.class, usuario.getId());
				livro.setUsuario(usr);
				em.persist(livro);
				return true;
			}
		}
		return false;
	}

	@Override
	public List<Livro> buscarLivro(String titulo, int idUsuario) {
		return em.createNamedQuery("Livro.findByTitle", Livro.class)
				.setParameter("titulo", titulo)
				.setParameter("idUsuario", idUsuario).getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Livro> buscarLivrosUsuario(int idUsuario){
		Query query = em.createNamedQuery("Livro.getLivrosByUsuario");
		query.setParameter("idUsuario", idUsuario);
		return query.getResultList();
	}
	
	/**
	 * Carrega (semanalmente) a lista de livros emprestados a mais de um m��s
	 */
	@Schedule(dayOfWeek="Mon", persistent=false)
	public void loadLivrosEmprestados(){
		// gera a data para comparar no sql
		//Calendar calendar = new GregorianCalendar();
		Calendar calendar = new GregorianCalendar();
		calendar.setTimeZone(TimeZone.getTimeZone("UTC-3")); // Hor��rio de bras��lia
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, -30); // configura a data para 30 dias anteriores �� data atual (hoje)
		Date dataParaComparar = calendar.getTime();
		 
		// recupera a lista de livros emprestados injetando a data gerada para compara����o din��mica
		this.livrosEmprestados = em.createNamedQuery("Livro.findEmprestadosAMaisDeUmMes", Livro.class)
				.setParameter("dataParaComparar", dataParaComparar).getResultList();
	}

	@Override
	// Retorna a lista de livros emprestados (se estiverem carregados) 
	public List<Livro> getLivrosEmprestadosAMaisDeUmMes() {
		return this.livrosEmprestados;
	}
}
